using BepuUtilities;

namespace BepuPhysics
{
    /// <summary>
    /// ITimesppers用于其阶段回调的委托。
    /// </summary>
    /// <param name="dt">时间步长。</param>
    /// <param name="threadDispatcher">此时间步使用的线程调度程序。</param>
    public delegate void TimestepperStageHandler(float dt, IThreadDispatcher threadDispatcher);

    /// <summary>
    /// ITimesppers使用的委托,用于在子步进循环中进行阶段回调。
    /// </summary>
    /// <param name="substepIndex">执行此阶段的子步骤的索引。</param>
    /// <param name="dt">时间步长。</param>
    /// <param name="threadDispatcher">此时间步使用的线程调度程序。</param>
    public delegate void TimestepperSubstepStageHandler(int substepIndex, float dt, IThreadDispatcher threadDispatcher);

    /// <summary>
    /// 定义能够在给定运行时间内更新模拟状态的类型。
    /// </summary>
    public interface ITimestepper
    {
        /// <summary>
        /// 在执行冲突检测之前立即执行的回调。
        /// </summary>
        event TimestepperStageHandler BeforeCollisionDetection;

        /// <summary>
        /// 冲突检测完成后要执行的回调。
        /// </summary>
        event TimestepperStageHandler CollisionsDetected;

        /// <summary>
        /// 执行给定长度的一个时间步。
        /// </summary>
        /// <param name="dt">时间点的持续时间。</param>
        /// <param name="threadDispatcher">用于执行的线程调度程序(如果有)。</param>
        void Timestep(Simulation simulation, float dt, IThreadDispatcher threadDispatcher = null);
    }
}
